package server;

import java.util.*;





/**
 * @author  Mattia
 */
public class Giocatore {
	
	/* ATTRIBUTI*/
	
	
	/**
	 * @uml.property  name="loggato"
	 */
	private boolean loggato;
	/**
	 * @uml.property  name="i"
	 */
	private int i; //VARIABILE CHE ATTRIBUISCE AL GIOCATORE IL SUO NUMERO IDENTIFICATIVO DI PARTITA
	/**
	 * @uml.property  name="nome"
	 */
	private String nome;
	/**
	 * @uml.property  name="password"
	 */
	private String password;
	/**
	 * @uml.property  name="specie"
	 */
	private String specie;
	/**
	 * @uml.property  name="punteggio"
	 */
	private int punteggio;
	/**
	 * @uml.property  name="num_giocatore"
	 */
	private int num_giocatore;
	/**
	 * @uml.property  name="turno"
	 */
	private int turno;
	private static int maxTurno=120;
	/**
	 * @uml.property  name="maxDinosauri"
	 */
	public static int maxDinosauri=5;
	/**
	 * @uml.property  name="brancoGiocatore"
	 */
	private ArrayList<Dinosauro> brancoGiocatore = new ArrayList<Dinosauro>();
	private boolean gameOver;
	/**
	 * @uml.property  name="tipologia"
	 */
	private boolean tipologia; //CARNIVORO=true, ERBIVORO=false
    private boolean[][] mappaEsplorata= new boolean[Mappa.getAltezza()][Mappa.getLarghezza()];
    
   


    //@ requires	nome!=null && password!=null && specie!=null;
	/** Costruttore di Giocatore
	 * 
	 * @param nome Nome del giocatore
	 * @param password Password del giocatore
	 * @param tipologia Tipologia del giocatore
	 * @param specie Specie scelta dal giocatore
	 */
    
    public Giocatore(String nome, String password, String specie,Boolean tipologia)
	{
		this.nome = nome;
		this.password = password;
		this.tipologia = tipologia;
		this.specie = specie;
		gameOver=false;
	}
	
		
    
    /* METODI */
    
 
	/**
	 * Restituisce num_giocatore
	 * @return  the num_giocatore
	 * @uml.property  name="num_giocatore"
	 */
	public int getNum_giocatore() {
		return num_giocatore;
	}

	/**
	 * Modifica variabile num_giocatore
	 * @param num_giocatore  the num_giocatore to set
	 * @uml.property  name="num_giocatore"
	 */
	public void setNum_giocatore(int num_giocatore) {
		this.num_giocatore = num_giocatore;
	}


	/**
	 * Restituisce la password d'accesso al server
	 * @return  the password
	 * @uml.property  name="password"
	 */
	public String getPassword() {
		return password;
	}

	
	/**
	 * Restituisce il punteggio del giocatore corrente
	 * @return  punteggio
	 * @uml.property  name="punteggio"
	 */
	public int getPunteggio() {
		return punteggio;
	}
	
	/**
	 * Modifica il punteggio del giocatore corrente
	 * @param punteggio  the punteggio to set
	 * @uml.property  name="punteggio"
	 */
	public void setPunteggio(int punteggio) {
		this.punteggio = punteggio;
	}


	/**
	 * Restituisce il nome del giocatore
	 * @return  nome Nome del giocatore
	 * @uml.property  name="nome"
	 */
	public String getNome(){
		return nome;
	}
	
	/**
	 * Restituisce la specie del giocatore
	 * @return  specie Specie del giocatore
	 * @uml.property  name="specie"
	 */
	public String getSpecie(){
		return specie;
	}
	
	
	/**
	 * @param  specie
	 * @uml.property  name="specie"
	 */
	public void setSpecie(String specie){
		this.specie=specie;
	}
	
	/** Dice se un giocatore ha perso
	 * 
	 * @return gameOver 
	 */
	public boolean haPerso(){
		return gameOver;
	}
	
	/** Elimina un giocatore dal gioco, settando gameOver a true
	 * 
	 */	
	public void gameOver(){
		gameOver=true;
		specie=null;
	}

	/**
	 * @return  tipologia
	 * @uml.property  name="tipologia"
	 */
	public boolean isTipologia() {
		return tipologia;
	}
	
	/**
	 * @param  tipologia
	 * @uml.property  name="tipologia"
	 */
	public void setTipologia(boolean tipologia){
		this.tipologia=tipologia;
	}
	
	/** Aggiunge un dinosauro al branco
	 * 
	 * @param dinosauro Dinosauro da aggiungere al branco
	 */
    public void aggiungiDinosauro(Dinosauro dinosauro){
    	getBrancoGiocatore().add(dinosauro);
    }
    
    /** Restituisce la dimensione del branco del giocatore
     * 
     * @return Dimensione del branco del giocatore
     */
    public int getDimensioneBrancoGiocatore(){
		return getBrancoGiocatore().size();
	}
    
    /** Incrementa il contatore turno
     * 
     */
    public void counterTurno(){
    	if (turno<maxTurno){
    		turno++;
    	}
    }

	/**
	 * Restituisce il valore della variabile turno
	 * @return  the turno
	 * @uml.property  name="turno"
	 */
	public int getTurno() {
		return turno;
	}



	/**
	 * @param i  the i to set
	 * @uml.property  name="i"
	 */
	public void setI(int i) {
		this.i = i;
	}



	/**
	 * @return  the i
	 * @uml.property  name="i"
	 */
	public int getI() {
		return i;
	}
    
	
    /**
	 * @return the mappaEsplorata[pos_y][pos_x]
	 */
	public boolean isCellaEsplorata(int pos_x, int pos_y) {
		return mappaEsplorata[pos_y][pos_x];
	}



	/**riceve in ingresso due variabili di posizione e setta 
	 * nella mappaEsplorata quella cella a "true"
	 * 
	 * @param pos_x
	 * @param pos_y
	 */
	public void setCellaEsplorata(int pos_x, int pos_y) {
		this.mappaEsplorata[pos_y][pos_x] = true;
	}
	public void setCellaNE(int pos_x, int pos_y) {
		this.mappaEsplorata[pos_y][pos_x] = false;
	}

	/**
	 * @return  the maxDinosauri
	 * @uml.property  name="maxDinosauri"
	 */
	public static int getMaxDinosauri() {
		return maxDinosauri;
	}



	/**
	 * @param brancoGiocatore  the brancoGiocatore to set
	 * @uml.property  name="brancoGiocatore"
	 */
	public void setBrancoGiocatore(ArrayList<Dinosauro> brancoGiocatore) {
		this.brancoGiocatore = brancoGiocatore;
	}



	/**
	 * @return  the brancoGiocatore
	 * @uml.property  name="brancoGiocatore"
	 */
	public ArrayList<Dinosauro> getBrancoGiocatore() {
		return brancoGiocatore;
	}



	/**
	 * @param loggato  the loggato to set
	 * @uml.property  name="loggato"
	 */
	public void setLoggato(boolean loggato) {
		this.loggato = loggato;
	}



	/**
	 * @return  the loggato
	 * @uml.property  name="loggato"
	 */
	public boolean isLoggato() {
		return loggato;
	}



	/**
	 * @param gameOver
	 * @uml.property  name="gameOver"
	 */
	public void setGameOver(boolean gameOver) {
		this.gameOver = gameOver;
	}
    
}
